package com.heima.activiti;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @Auth: zhuan
 * @Desc: Activiti第二步：流程实例--业务和流程结合，不用再使用状态字段进行流程控制
 * @Date: 2022-03-25 17:45:45
 */
@SpringBootTest(classes = SpringbootActivity7Application.class)
@RunWith(SpringRunner.class)
public class ActivitiProcessInstance002 {
		/**
		 * RuntimeService:
		 * 	Activiti的流程运行管理接口，可以从这个接口中获取很多关于流程执行相关的信息
		 */
		@Autowired
		private RuntimeService runtimeService;

		/**
		 * 功能描述: 初始化流程实例----相当于一个人发起了一个请假申请并填写了【请假申请单】
		 * @return : void
		 */
		@Test
		public void initProcessInstance(){
				//1、获取页面表单填报的内容，请假时间，请假事由，String fromData
				//2、fromData 写入业务表，返回业务表主键ID==businessKey
				//3、把业务数据与Activiti7流程数据关联
				/**
				 * startProcessInstanceByKey方法详解：
				 * 		processDefinitionKey：流程定义key，对应不同的流程，一般和我们定义的【bpmn】流程图一致，例如：请假申请流程、发票报销流程
				 * 		businessKey：业务ID，不同业务就不同的ID，例如：请假业务、发票业务，对应的数据都是存在对应的业务表中的
				 * 总结：一般【processDefinitionKey】、【businessKey】是对应的，成对存在，例如：请假业务<---->请假申请流程...
				 */
				ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("请假申请流程","heima-002");
				System.out.println("流程实例ID："+processInstance.getProcessDefinitionId());

		}
		/**
		 * 功能描述: 获取流程实例列表--查看所有的流程实例
		 * @return : void
		 */
		@Test
		public void getProcessInstances(){
				List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();
				for(ProcessInstance pi : list){
						System.out.println("--------流程实例------");
						System.out.println("ProcessInstanceId："+pi.getProcessInstanceId());
						System.out.println("ProcessDefinitionId："+pi.getProcessDefinitionId());
						System.out.println("isEnded:"+pi.isEnded());
						System.out.println("isSuspended："+pi.isSuspended());
				}

		}
		/**
		 * 功能描述: 挂起与激活流程实例
		 * 		挂起流程实例：由于流程变更需要，将当前运行的流程暂停，流程暂停后将不会继续执行
		 * 		激活流程实例：变更结束，可以重新激活流程实例，流程会继续执行
		 * @return : void
		 */
		@Test
		public void activitieProcessInstance(){
				//runtimeService.suspendProcessInstanceById("00c0508f-ac2a-11ec-aeca-005056c00008");
				//System.out.println("挂起流程实例");

				runtimeService.activateProcessInstanceById("00c0508f-ac2a-11ec-aeca-005056c00008");
				System.out.println("激活流程实例");
		}
		/**
		 * 功能描述: 删除流程实例----相当于一个人删除了自己的【请假申请单】
		 * @return : void
		 */
		@Test
		public void delProcessInstance(){
				runtimeService.deleteProcessInstance("00c0508f-ac2a-11ec-aeca-005056c00008","删着玩");
				System.out.println("删除流程实例");
		}
}
